package spam;

import importantes.Vocab;

import javax.mail.internet.*;
import javax.mail.search.BodyTerm;
import javax.mail.search.SearchTerm;
import javax.mail.*;
import javax.mail.Flags.Flag;

import java.io.IOException;
import java.util.*;

import javax.activation.*;

import com.sun.mail.imap.IMAPFolder;

public class spam {

	public static float CorreosNormales;
	public static float CorreosImportantes;
	public static float PImportantes;
	public static float PNormales;
	public static float NumeroVocabulario;
	public static float ApareceImportantes = 0;
	public static float ApareceNormales = 0;
	public static float k = 1;
	public static float clases = 2;
	public static String cadenaimportantes = "";
	public static String cadenanormales = "";
	public static float n;
	public static float ka;
	public static float ProbTotal;

	
	public spam(){}
	
	
	
	public static void main(String[] args) {
		if (args.length != 2) {
			System.out.println("Ha de enviar dos par�metros\n"
					+ "java ObtenerCorreoIMAP usuario clave");
			System.exit(1);
		}
		// Obtener el usuario y la clave recibidos como par�metros
		String usuario = args[0];
		String clave = args[1];
		// Obtener las propiedades del sistema
		String popHost = "imap.gmail.com";
		Properties props = System.getProperties();
		props.setProperty("mail.store.protocol", "imaps");

		// Obtener una sesi�n con las propiedades anteriormente definidas
		Session sesion = Session.getDefaultInstance(props, null);
		try {
			// Crear un Store indicando el protocolo de acceso y
			// conectarse a �l
			Store store = sesion.getStore("imaps");
			store.connect(popHost, usuario, clave);
			// Crear un objeto Folder y obtener la carpeta por defecto
			Folder folder = store.getDefaultFolder();
			// ==========================================
			// Crear una carpeta llamada Universidad
			// ==========================================
			// Folder universidadFolder = folder.getFolder("INBOX.Universidad");
			//
			// universidadFolder.create(Folder.HOLDS_MESSAGES);

			// ==========================================
			// Obtener las carpetas almacenadas bajo la carpeta por defecto
			// ==========================================
			Folder[] listaCarpetas = folder.list("*");

		//	 Nombre de cada carpeta y sus atributos
			 for (int i = 0; i < listaCarpetas.length; i++) {
			
			 System.out.println("Carpeta:" + listaCarpetas[i].getFullName());
			 IMAPFolder imf = (IMAPFolder) listaCarpetas[i];
			 String[] atributos = imf.getAttributes();
			 System.out.println("\t" + "Atributos: ");
			 for (int j = 0; j < atributos.length; j++)
			 System.out.println("\t" + atributos[j] + "\n");
			 // Carpeta padre de cada carpeta
			 System.out.println("\t" + "Carpeta Padre: "
			 + listaCarpetas[i].getParent().getName() + "\n");
			 }

			// ==========================
			// Copiar mensajes
			// ==========================
			// Message[] mensajesCopiar = new Message[2];
			
			// Folder trashFolder = store.getFolder("[Gmail]/Papelera");
			// trashFolder.open(Folder.READ_WRITE);
			Folder LiamSpam = store.getFolder("[Gmail]/Spam");
			LiamSpam.open(Folder.READ_WRITE);
			Folder INBOX = store.getFolder("INBOX");
			INBOX.open(Folder.READ_WRITE);
			// Concatenar a la lista de mensajes de la carpeta que le pasamos
			// como par�metro, el array de mensajes formado con los mensajes
			// de la carpeta origen
			
			// mensajesCopiar[1] = INBOXFolder.getMessage(2);
			
			// INBOXFolder.close(false);

			// INBOXFolder.open(Folder.READ_ONLY);
			// Buscar los mensajes que en el campo asunto contengan la palabra
			// hola
			// SearchTerm stAsunto = new SubjectTerm ("UMTS");

			// INBOXFolder.close(false);
//			SearchTerm Bcuerpo = new BodyTerm("rombardy");
//			Message[] mensajesAsunto = LiamSpam.search(Bcuerpo);
//			System.err.println(mensajesAsunto.length);

			// ==============================================
			// Obtener los mensajes de la carpeta INBOX.Trash
			// ==============================================
			Message[] mensajesLiamSpam = LiamSpam.getMessages();
			// Procesar los mensajes
			for (int i = 0; i < mensajesLiamSpam.length; i++) {
				System.out.println("Mensaje " + i + ":\n" + "\tAsunto: "
						+ mensajesLiamSpam[i].getSubject() + "\n"
						+ "\tRemitente: "
						+ mensajesLiamSpam[i].getFrom()[0] + "\n"
						+ "\tFecha de Env�o: "
						+ mensajesLiamSpam[i].getSentDate() + "\n"
						+ "\tContenido: "
						+ mensajesLiamSpam[i].getContent() + "\n");
				
				cadenaimportantes += mensajesLiamSpam[i].getSubject()
						+ " ";
			}
			
			
			
			Message[] mensajesINBOX = INBOX.getMessages();
			// Procesar los mensajes
			for (int i = 0; i < mensajesINBOX.length - 1; i++) {
			/*	System.out.println("Mensaje " + i + ":\n" + "\tAsunto: "
						+ mensajesINBOX[i].getSubject() + "\n"
						+ "\tRemitente: " + mensajesINBOX[i].getFrom()[0]
						+ "\n" + "\tFecha de Env�o: "
						+ mensajesINBOX[i].getSentDate() + "\n"
						+ "\tContenido: " + mensajesINBOX[i].getContent()
						+ "\n");*/
				cadenanormales += mensajesINBOX[i].getSubject() + " ";
			}

			

			
			String UltimoCorreo[] = mensajesINBOX[mensajesINBOX.length - 1]
					.getSubject().split(" ");

			NumeroVocabulario = new Vocab(cadenaimportantes + cadenanormales)
					.contarTodas();
			CorreosImportantes = mensajesLiamSpam.length;
			CorreosNormales = mensajesINBOX.length - 1;
			String PalabrasImportantes[] = cadenaimportantes.split(" ");
			String PalabrasNormales[] = cadenanormales.split(" ");

			PImportantes = PalabrasImportantes.length;
			PNormales = PalabrasNormales.length;

			n = ((CorreosImportantes + k) / (CorreosImportantes
					+ CorreosNormales + clases));
			System.out.println(n+" p(importe)");

			ka = (CorreosNormales + k)
					/ (CorreosImportantes + CorreosNormales + clases);
			
			System.out.println(ka+" p(normal)");

			for (int i = 0; i < UltimoCorreo.length; i++) {
				ApareceImportantes = 0;
				for (int j = 0; j < PalabrasImportantes.length; j++) {
					if (UltimoCorreo[i]
							.equalsIgnoreCase(PalabrasImportantes[j])) {
						ApareceImportantes++;
					}
				}
				n *= ((ApareceImportantes + k) / (PImportantes + NumeroVocabulario));
			}

			for (int i = 0; i < UltimoCorreo.length; i++) {
				ApareceNormales = 0;
				for (int j = 0; j < PalabrasNormales.length; j++) {
					if (UltimoCorreo[i].equalsIgnoreCase(PalabrasNormales[j])) {
						ApareceNormales++;
					}
				}
				ka *= ((ApareceNormales + k) / (PNormales + NumeroVocabulario));
			}

			ProbTotal = ((n) / (n + ka));
		
			if(ProbTotal > 0.7){
				
				Message[] mensajeCopiar = new Message[1];
				mensajeCopiar[0] = mensajesINBOX[mensajesINBOX.length - 1];
				INBOX.copyMessages(mensajeCopiar, LiamSpam);
				//mensajeCopiar[0].
				mensajeCopiar[0].setFlag(Flags.Flag.DELETED, true);
				INBOX.expunge();
				
				System.err.println("la Probabilidad fue mayor que el limite, mensaje movido");
			}
			
			LiamSpam.close(false);
			INBOX.close(false);

			// ==========================
			// Borrar una carpeta
			// ==========================
			System.err.println(CorreosImportantes+" CorreosImportantes");
			System.err.println(CorreosNormales+" CorreosNormales");
			System.err.println(NumeroVocabulario+" # Vocabulario");
			System.err.println(PImportantes+" Palabras Importantes");
			System.err.println(PNormales+" Palabras Normales");
			System.err.println(n);
			System.err.println(ka);
			System.err.println(ProbTotal+" P(importate | M) = n / n + ka");
			System.err.println(cadenaimportantes);
			System.err.println(cadenanormales);
			
			// universidadFolder.delete(false); // si se comenta esto no la
			// borra y
			// se puede ver

			store.close();
		} catch (MessagingException me) {
			System.err.println(me.toString());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	
	
	
	
	
	public void importante(String usuario, String clave) {
		
		// Obtener el usuario y la clave recibidos como par�metros
		// Obtener las propiedades del sistema
		String popHost = "imap.gmail.com";
		Properties props = System.getProperties();
		props.setProperty("mail.store.protocol", "imaps");

		// Obtener una sesi�n con las propiedades anteriormente definidas
		Session sesion = Session.getDefaultInstance(props, null);
		try {
			// Crear un Store indicando el protocolo de acceso y
			// conectarse a �l
			Store store = sesion.getStore("imaps");
			store.connect(popHost, usuario, clave);
			// Crear un objeto Folder y obtener la carpeta por defecto
			Folder folder = store.getDefaultFolder();
			// ==========================================
			// Crear una carpeta llamada Universidad
			// ==========================================
			// Folder universidadFolder = folder.getFolder("INBOX.Universidad");
			//
			// universidadFolder.create(Folder.HOLDS_MESSAGES);

			// ==========================================
			// Obtener las carpetas almacenadas bajo la carpeta por defecto
			// ==========================================
			Folder[] listaCarpetas = folder.list("*");

			// Nombre de cada carpeta y sus atributos
			// for (int i = 0; i < listaCarpetas.length; i++) {
			//
			// System.out.println("Carpeta:" + listaCarpetas[i].getFullName());
			// IMAPFolder imf = (IMAPFolder) listaCarpetas[i];
			// String[] atributos = imf.getAttributes();
			// System.out.println("\t" + "Atributos: ");
			// for (int j = 0; j < atributos.length; j++)
			// System.out.println("\t" + atributos[j] + "\n");
			// // Carpeta padre de cada carpeta
			// System.out.println("\t" + "Carpeta Padre: "
			// + listaCarpetas[i].getParent().getName() + "\n");
			// }

			// ==========================
			// Copiar mensajes
			// ==========================
			// Message[] mensajesCopiar = new Message[2];
			
			// Folder trashFolder = store.getFolder("[Gmail]/Papelera");
			// trashFolder.open(Folder.READ_WRITE);
			Folder LiamSpam = store.getFolder("[Gmail]/Spam");
			LiamSpam.open(Folder.READ_WRITE);
			Folder INBOX = store.getFolder("INBOX");
			INBOX.open(Folder.READ_WRITE);
			// Concatenar a la lista de mensajes de la carpeta que le pasamos
			// como par�metro, el array de mensajes formado con los mensajes
			// de la carpeta origen
			
			// mensajesCopiar[1] = INBOXFolder.getMessage(2);
			
			// INBOXFolder.close(false);

			// INBOXFolder.open(Folder.READ_ONLY);
			// Buscar los mensajes que en el campo asunto contengan la palabra
			// hola
			// SearchTerm stAsunto = new SubjectTerm ("UMTS");

			// INBOXFolder.close(false);
//			SearchTerm Bcuerpo = new BodyTerm("rombardy");
//			Message[] mensajesAsunto = LiamSpam.search(Bcuerpo);
//			System.err.println(mensajesAsunto.length);

			// ==============================================
			// Obtener los mensajes de la carpeta INBOX.Trash
			// ==============================================
			Message[] mensajesLiamSpam = LiamSpam.getMessages();
			// Procesar los mensajes
			for (int i = 0; i < mensajesLiamSpam.length; i++) {
				/*System.out.println("Mensaje " + i + ":\n" + "\tAsunto: "
						+ mensajesLiamSpam[i].getSubject() + "\n"
						+ "\tRemitente: "
						+ mensajesLiamSpam[i].getFrom()[0] + "\n"
						+ "\tFecha de Env�o: "
						+ mensajesLiamSpam[i].getSentDate() + "\n"
						+ "\tContenido: "
						+ mensajesLiamSpam[i].getContent() + "\n");*/
				
				cadenaimportantes += mensajesLiamSpam[i].getSubject()
						+ " ";
			}
			
			
			
			Message[] mensajesINBOX = INBOX.getMessages();
			// Procesar los mensajes
			for (int i = 0; i < mensajesINBOX.length - 1; i++) {
			/*	System.out.println("Mensaje " + i + ":\n" + "\tAsunto: "
						+ mensajesINBOX[i].getSubject() + "\n"
						+ "\tRemitente: " + mensajesINBOX[i].getFrom()[0]
						+ "\n" + "\tFecha de Env�o: "
						+ mensajesINBOX[i].getSentDate() + "\n"
						+ "\tContenido: " + mensajesINBOX[i].getContent()
						+ "\n");*/
				cadenanormales += mensajesINBOX[i].getSubject() + " ";
			}

			

			
			String UltimoCorreo[] = mensajesINBOX[mensajesINBOX.length - 1]
					.getSubject().split(" ");

			NumeroVocabulario = new Vocab(cadenaimportantes + cadenanormales)
					.contarTodas();
			CorreosImportantes = mensajesLiamSpam.length;
			CorreosNormales = mensajesINBOX.length - 1;
			String PalabrasImportantes[] = cadenaimportantes.split(" ");
			String PalabrasNormales[] = cadenanormales.split(" ");

			PImportantes = PalabrasImportantes.length;
			PNormales = PalabrasNormales.length;

			n = ((CorreosImportantes + k) / (CorreosImportantes
					+ CorreosNormales + clases));
			System.out.println(n+" p(importe)");

			ka = (CorreosNormales + k)
					/ (CorreosImportantes + CorreosNormales + clases);
			
			System.out.println(ka+" p(normal)");

			for (int i = 0; i < UltimoCorreo.length; i++) {
				ApareceImportantes = 0;
				for (int j = 0; j < PalabrasImportantes.length; j++) {
					if (UltimoCorreo[i]
							.equalsIgnoreCase(PalabrasImportantes[j])) {
						ApareceImportantes++;
					}
				}
				n *= ((ApareceImportantes + k) / (PImportantes + NumeroVocabulario));
			}

			for (int i = 0; i < UltimoCorreo.length; i++) {
				ApareceNormales = 0;
				for (int j = 0; j < PalabrasNormales.length; j++) {
					if (UltimoCorreo[i].equalsIgnoreCase(PalabrasNormales[j])) {
						ApareceNormales++;
					}
				}
				ka *= ((ApareceNormales + k) / (PNormales + NumeroVocabulario));
			}

			ProbTotal = ((n) / (n + ka));
		
			if(ProbTotal > 0.7){
				
				Message[] mensajeCopiar = new Message[1];
				mensajeCopiar[0] = mensajesINBOX[mensajesINBOX.length - 1];
				INBOX.copyMessages(mensajeCopiar, LiamSpam);
				//mensajeCopiar[0].
				mensajeCopiar[0].setFlag(Flags.Flag.DELETED, true);
				INBOX.expunge();
				
				System.err.println("la Probabilidad fue mayor que el limite, mensaje movido");
			}
			
			LiamSpam.close(false);
			INBOX.close(false);

			// ==========================
			// Borrar una carpeta
			// ==========================
			System.err.println(CorreosImportantes+" CorreosImportantes");
			System.err.println(CorreosNormales+" CorreosNormales");
			System.err.println(NumeroVocabulario+" # Vocabulario");
			System.err.println(PImportantes+" Palabras Importantes");
			System.err.println(PNormales+" Palabras Normales");
			System.err.println(n);
			System.err.println(ka);
			System.err.println(ProbTotal+" P(importate | M) = n / n + ka");
			System.err.println(cadenaimportantes);
			System.err.println(cadenanormales);
			
			// universidadFolder.delete(false); // si se comenta esto no la
			// borra y
			// se puede ver

			store.close();
		} catch (MessagingException me) {
			System.err.println(me.toString());
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}